define([
  'exports',
  './Transforms-7cd3197b',
  './Matrix2-f2da41d4',
  './RuntimeError-ffe03243',
  './when-229515d6',
  './EllipsoidTangentPlane-b27cd2f7',
  './ComponentDatatype-17b06483',
  './Plane-0421a8be',
], function (a, t, e, n, r, i, s, o) {
  'use strict';
  function C(a, t) {
    (this.center = e.Cartesian3.clone(r.defaultValue(a, e.Cartesian3.ZERO))),
      (this.halfAxes = e.Matrix3.clone(r.defaultValue(t, e.Matrix3.ZERO)));
  }
  (C.packedLength = e.Cartesian3.packedLength + e.Matrix3.packedLength),
    (C.pack = function (a, t, n) {
      return (
        (n = r.defaultValue(n, 0)),
        e.Cartesian3.pack(a.center, t, n),
        e.Matrix3.pack(a.halfAxes, t, n + e.Cartesian3.packedLength),
        t
      );
    }),
    (C.unpack = function (a, t, n) {
      return (
        (t = r.defaultValue(t, 0)),
        r.defined(n) || (n = new C()),
        e.Cartesian3.unpack(a, t, n.center),
        e.Matrix3.unpack(a, t + e.Cartesian3.packedLength, n.halfAxes),
        n
      );
    });
  var c = new e.Cartesian3(),
    u = new e.Cartesian3(),
    d = new e.Cartesian3(),
    l = new e.Cartesian3(),
    h = new e.Cartesian3(),
    x = new e.Cartesian3(),
    m = new e.Matrix3(),
    M = { unitary: new e.Matrix3(), diagonal: new e.Matrix3() };
  C.fromPoints = function (a, t) {
    if ((r.defined(t) || (t = new C()), !r.defined(a) || 0 === a.length))
      return (t.halfAxes = e.Matrix3.ZERO), (t.center = e.Cartesian3.ZERO), t;
    var n,
      i = a.length,
      s = e.Cartesian3.clone(a[0], c);
    for (n = 1; n < i; n++) e.Cartesian3.add(s, a[n], s);
    var o = 1 / i;
    e.Cartesian3.multiplyByScalar(s, o, s);
    var f,
      p = 0,
      g = 0,
      w = 0,
      y = 0,
      N = 0,
      b = 0;
    for (n = 0; n < i; n++)
      (p += (f = e.Cartesian3.subtract(a[n], s, u)).x * f.x),
        (g += f.x * f.y),
        (w += f.x * f.z),
        (y += f.y * f.y),
        (N += f.y * f.z),
        (b += f.z * f.z);
    (p *= o), (g *= o), (w *= o), (y *= o), (N *= o), (b *= o);
    var O = m;
    (O[0] = p),
      (O[1] = g),
      (O[2] = w),
      (O[3] = g),
      (O[4] = y),
      (O[5] = N),
      (O[6] = w),
      (O[7] = N),
      (O[8] = b);
    var v = e.Matrix3.computeEigenDecomposition(O, M),
      P = e.Matrix3.clone(v.unitary, t.halfAxes),
      T = e.Matrix3.getColumn(P, 0, l),
      A = e.Matrix3.getColumn(P, 1, h),
      I = e.Matrix3.getColumn(P, 2, x),
      R = -Number.MAX_VALUE,
      E = -Number.MAX_VALUE,
      S = -Number.MAX_VALUE,
      U = Number.MAX_VALUE,
      L = Number.MAX_VALUE,
      z = Number.MAX_VALUE;
    for (n = 0; n < i; n++)
      (f = a[n]),
        (R = Math.max(e.Cartesian3.dot(T, f), R)),
        (E = Math.max(e.Cartesian3.dot(A, f), E)),
        (S = Math.max(e.Cartesian3.dot(I, f), S)),
        (U = Math.min(e.Cartesian3.dot(T, f), U)),
        (L = Math.min(e.Cartesian3.dot(A, f), L)),
        (z = Math.min(e.Cartesian3.dot(I, f), z));
    (T = e.Cartesian3.multiplyByScalar(T, 0.5 * (U + R), T)),
      (A = e.Cartesian3.multiplyByScalar(A, 0.5 * (L + E), A)),
      (I = e.Cartesian3.multiplyByScalar(I, 0.5 * (z + S), I));
    var B = e.Cartesian3.add(T, A, t.center);
    e.Cartesian3.add(B, I, B);
    var V = d;
    return (
      (V.x = R - U),
      (V.y = E - L),
      (V.z = S - z),
      e.Cartesian3.multiplyByScalar(V, 0.5, V),
      e.Matrix3.multiplyByScale(t.halfAxes, V, t.halfAxes),
      t
    );
  };
  var f = new e.Cartesian3(),
    p = new e.Cartesian3();
  function g(a, t, n, i, s, o, c, u, d, l, h) {
    r.defined(h) || (h = new C());
    var x = h.halfAxes;
    e.Matrix3.setColumn(x, 0, t, x),
      e.Matrix3.setColumn(x, 1, n, x),
      e.Matrix3.setColumn(x, 2, i, x);
    var m = f;
    (m.x = (s + o) / 2), (m.y = (c + u) / 2), (m.z = (d + l) / 2);
    var M = p;
    (M.x = (o - s) / 2), (M.y = (u - c) / 2), (M.z = (l - d) / 2);
    var g = h.center;
    return (
      (m = e.Matrix3.multiplyByVector(x, m, m)),
      e.Cartesian3.add(a, m, g),
      e.Matrix3.multiplyByScale(x, M, x),
      h
    );
  }
  var w = new e.Cartographic(),
    y = new e.Cartesian3(),
    N = new e.Cartographic(),
    b = new e.Cartographic(),
    O = new e.Cartographic(),
    v = new e.Cartographic(),
    P = new e.Cartographic(),
    T = new e.Cartesian3(),
    A = new e.Cartesian3(),
    I = new e.Cartesian3(),
    R = new e.Cartesian3(),
    E = new e.Cartesian3(),
    S = new e.Cartesian2(),
    U = new e.Cartesian2(),
    L = new e.Cartesian2(),
    z = new e.Cartesian2(),
    B = new e.Cartesian2(),
    V = new e.Cartesian3(),
    _ = new e.Cartesian3(),
    k = new e.Cartesian3(),
    W = new e.Cartesian3(),
    D = new e.Cartesian2(),
    X = new e.Cartesian3(),
    q = new e.Cartesian3(),
    j = new e.Cartesian3(),
    Z = new o.Plane(e.Cartesian3.UNIT_X, 0);
  (C.fromRectangle = function (a, t, n, C, c) {
    var u, d, l, h, x, m, M;
    if (
      ((t = r.defaultValue(t, 0)),
      (n = r.defaultValue(n, 0)),
      (C = r.defaultValue(C, e.Ellipsoid.WGS84)),
      a.width <= s.CesiumMath.PI)
    ) {
      var f = e.Rectangle.center(a, w),
        p = C.cartographicToCartesian(f, y),
        Y = new i.EllipsoidTangentPlane(p, C);
      M = Y.plane;
      var G = f.longitude,
        F = a.south < 0 && a.north > 0 ? 0 : f.latitude,
        H = e.Cartographic.fromRadians(G, a.north, n, N),
        J = e.Cartographic.fromRadians(a.west, a.north, n, b),
        K = e.Cartographic.fromRadians(a.west, F, n, O),
        Q = e.Cartographic.fromRadians(a.west, a.south, n, v),
        $ = e.Cartographic.fromRadians(G, a.south, n, P),
        aa = C.cartographicToCartesian(H, T),
        ta = C.cartographicToCartesian(J, A),
        ea = C.cartographicToCartesian(K, I),
        na = C.cartographicToCartesian(Q, R),
        ra = C.cartographicToCartesian($, E),
        ia = Y.projectPointToNearestOnPlane(aa, S),
        sa = Y.projectPointToNearestOnPlane(ta, U),
        oa = Y.projectPointToNearestOnPlane(ea, L),
        Ca = Y.projectPointToNearestOnPlane(na, z),
        ca = Y.projectPointToNearestOnPlane(ra, B);
      return (
        (d = -(u = Math.min(sa.x, oa.x, Ca.x))),
        (h = Math.max(sa.y, ia.y)),
        (l = Math.min(Ca.y, ca.y)),
        (J.height = Q.height = t),
        (ta = C.cartographicToCartesian(J, A)),
        (na = C.cartographicToCartesian(Q, R)),
        (x = Math.min(o.Plane.getPointDistance(M, ta), o.Plane.getPointDistance(M, na))),
        (m = n),
        g(Y.origin, Y.xAxis, Y.yAxis, Y.zAxis, u, d, l, h, x, m, c)
      );
    }
    var ua = a.south > 0,
      da = a.north < 0,
      la = ua ? a.south : da ? a.north : 0,
      ha = e.Rectangle.center(a, w).longitude,
      xa = e.Cartesian3.fromRadians(ha, la, n, C, V);
    xa.z = 0;
    var ma =
        Math.abs(xa.x) < s.CesiumMath.EPSILON10 && Math.abs(xa.y) < s.CesiumMath.EPSILON10
          ? e.Cartesian3.UNIT_X
          : e.Cartesian3.normalize(xa, _),
      Ma = e.Cartesian3.UNIT_Z,
      fa = e.Cartesian3.cross(ma, Ma, k);
    M = o.Plane.fromPointNormal(xa, ma, Z);
    var pa = e.Cartesian3.fromRadians(ha + s.CesiumMath.PI_OVER_TWO, la, n, C, W);
    (u = -(d = e.Cartesian3.dot(o.Plane.projectPointOntoPlane(M, pa, D), fa))),
      (h = e.Cartesian3.fromRadians(0, a.north, da ? t : n, C, X).z),
      (l = e.Cartesian3.fromRadians(0, a.south, ua ? t : n, C, q).z);
    var ga = e.Cartesian3.fromRadians(a.east, la, n, C, j);
    return g(xa, fa, Ma, ma, u, d, l, h, (x = o.Plane.getPointDistance(M, ga)), (m = 0), c);
  }),
    (C.clone = function (a, t) {
      if (r.defined(a))
        return r.defined(t)
          ? (e.Cartesian3.clone(a.center, t.center), e.Matrix3.clone(a.halfAxes, t.halfAxes), t)
          : new C(a.center, a.halfAxes);
    }),
    (C.intersectPlane = function (a, n) {
      var r = a.center,
        i = n.normal,
        s = a.halfAxes,
        o = i.x,
        C = i.y,
        c = i.z,
        u =
          Math.abs(
            o * s[e.Matrix3.COLUMN0ROW0] +
              C * s[e.Matrix3.COLUMN0ROW1] +
              c * s[e.Matrix3.COLUMN0ROW2]
          ) +
          Math.abs(
            o * s[e.Matrix3.COLUMN1ROW0] +
              C * s[e.Matrix3.COLUMN1ROW1] +
              c * s[e.Matrix3.COLUMN1ROW2]
          ) +
          Math.abs(
            o * s[e.Matrix3.COLUMN2ROW0] +
              C * s[e.Matrix3.COLUMN2ROW1] +
              c * s[e.Matrix3.COLUMN2ROW2]
          ),
        d = e.Cartesian3.dot(i, r) + n.distance;
      return d <= -u ? t.Intersect.OUTSIDE : d >= u ? t.Intersect.INSIDE : t.Intersect.INTERSECTING;
    });
  var Y = new e.Cartesian3(),
    G = new e.Cartesian3(),
    F = new e.Cartesian3(),
    H = new e.Cartesian3(),
    J = new e.Cartesian3(),
    K = new e.Cartesian3();
  C.distanceSquaredTo = function (a, t) {
    var n = e.Cartesian3.subtract(t, a.center, f),
      r = a.halfAxes,
      i = e.Matrix3.getColumn(r, 0, Y),
      o = e.Matrix3.getColumn(r, 1, G),
      C = e.Matrix3.getColumn(r, 2, F),
      c = e.Cartesian3.magnitude(i),
      u = e.Cartesian3.magnitude(o),
      d = e.Cartesian3.magnitude(C),
      l = !0,
      h = !0,
      x = !0;
    c > 0 ? e.Cartesian3.divideByScalar(i, c, i) : (l = !1),
      u > 0 ? e.Cartesian3.divideByScalar(o, u, o) : (h = !1),
      d > 0 ? e.Cartesian3.divideByScalar(C, d, C) : (x = !1);
    var m,
      M,
      p,
      g = !l + !h + !x;
    if (1 === g) {
      var w = i;
      (m = o),
        (M = C),
        h ? x || ((w = C), (M = i)) : ((w = o), (m = i)),
        (p = e.Cartesian3.cross(m, M, J)),
        w === i ? (i = p) : w === o ? (o = p) : w === C && (C = p);
    } else if (2 === g) {
      (m = i), h ? (m = o) : x && (m = C);
      var y = e.Cartesian3.UNIT_Y;
      y.equalsEpsilon(m, s.CesiumMath.EPSILON3) && (y = e.Cartesian3.UNIT_X),
        (M = e.Cartesian3.cross(m, y, H)),
        e.Cartesian3.normalize(M, M),
        (p = e.Cartesian3.cross(m, M, J)),
        e.Cartesian3.normalize(p, p),
        m === i ? ((o = M), (C = p)) : m === o ? ((C = M), (i = p)) : m === C && ((i = M), (o = p));
    } else
      3 === g && ((i = e.Cartesian3.UNIT_X), (o = e.Cartesian3.UNIT_Y), (C = e.Cartesian3.UNIT_Z));
    var N = K;
    (N.x = e.Cartesian3.dot(n, i)), (N.y = e.Cartesian3.dot(n, o)), (N.z = e.Cartesian3.dot(n, C));
    var b,
      O = 0;
    return (
      N.x < -c ? (O += (b = N.x + c) * b) : N.x > c && (O += (b = N.x - c) * b),
      N.y < -u ? (O += (b = N.y + u) * b) : N.y > u && (O += (b = N.y - u) * b),
      N.z < -d ? (O += (b = N.z + d) * b) : N.z > d && (O += (b = N.z - d) * b),
      O
    );
  };
  var Q = new e.Cartesian3(),
    $ = new e.Cartesian3();
  C.computePlaneDistances = function (a, n, i, s) {
    r.defined(s) || (s = new t.Interval());
    var o = Number.POSITIVE_INFINITY,
      C = Number.NEGATIVE_INFINITY,
      c = a.center,
      u = a.halfAxes,
      d = e.Matrix3.getColumn(u, 0, Y),
      l = e.Matrix3.getColumn(u, 1, G),
      h = e.Matrix3.getColumn(u, 2, F),
      x = e.Cartesian3.add(d, l, Q);
    e.Cartesian3.add(x, h, x), e.Cartesian3.add(x, c, x);
    var m = e.Cartesian3.subtract(x, n, $),
      M = e.Cartesian3.dot(i, m);
    return (
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.add(c, d, x),
      e.Cartesian3.add(x, l, x),
      e.Cartesian3.subtract(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.add(c, d, x),
      e.Cartesian3.subtract(x, l, x),
      e.Cartesian3.add(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.add(c, d, x),
      e.Cartesian3.subtract(x, l, x),
      e.Cartesian3.subtract(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.subtract(c, d, x),
      e.Cartesian3.add(x, l, x),
      e.Cartesian3.add(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.subtract(c, d, x),
      e.Cartesian3.add(x, l, x),
      e.Cartesian3.subtract(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.subtract(c, d, x),
      e.Cartesian3.subtract(x, l, x),
      e.Cartesian3.add(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      e.Cartesian3.subtract(c, d, x),
      e.Cartesian3.subtract(x, l, x),
      e.Cartesian3.subtract(x, h, x),
      e.Cartesian3.subtract(x, n, m),
      (M = e.Cartesian3.dot(i, m)),
      (o = Math.min(M, o)),
      (C = Math.max(M, C)),
      (s.start = o),
      (s.stop = C),
      s
    );
  };
  var aa = new t.BoundingSphere();
  (C.isOccluded = function (a, e) {
    var n = t.BoundingSphere.fromOrientedBoundingBox(a, aa);
    return !e.isBoundingSphereVisible(n);
  }),
    (C.prototype.intersectPlane = function (a) {
      return C.intersectPlane(this, a);
    }),
    (C.prototype.distanceSquaredTo = function (a) {
      return C.distanceSquaredTo(this, a);
    }),
    (C.prototype.computePlaneDistances = function (a, t, e) {
      return C.computePlaneDistances(this, a, t, e);
    }),
    (C.prototype.isOccluded = function (a) {
      return C.isOccluded(this, a);
    }),
    (C.equals = function (a, t) {
      return (
        a === t ||
        (r.defined(a) &&
          r.defined(t) &&
          e.Cartesian3.equals(a.center, t.center) &&
          e.Matrix3.equals(a.halfAxes, t.halfAxes))
      );
    }),
    (C.prototype.clone = function (a) {
      return C.clone(this, a);
    }),
    (C.prototype.equals = function (a) {
      return C.equals(this, a);
    }),
    (a.OrientedBoundingBox = C);
});
